package com.wanji.gateway.command;

import cn.hutool.core.util.IdUtil;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.wanji.gateway.constant.CommandPriority;
import com.wanji.gateway.constant.CommandType;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 设备指令基础实现类
 * 支持指令编码、优先级管理、超时控制等功能
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BaseDeviceCommand implements DeviceCommand {
    // 指令唯一ID（使用UUID生成）
    private String id = IdUtil.getSnowflakeNextIdStr();

    // 指令类型（如：READ_DATA, SET_PARAM, REBOOT等）
    private CommandType type;

    // 指令参数（键值对形式存储）
    private Map<String, Object> params = new HashMap<>();

    // 指令优先级（默认5，数值越大优先级越高）
    private CommandPriority priority = CommandPriority.LOW;

    // 指令超时时间（默认3000ms）
    private long timeout = 3000;

    // 指令确认状态
    private volatile boolean acknowledged = false;

    // 构造函数（指定指令类型）
    public BaseDeviceCommand(CommandType type) {
        this.type = type;
    }

    // 添加指令参数
    public void addParam(String key, Object value) {
        params.put(key, value);
    }

    // 指令编码实现（示例：将指令转换为JSON格式）
    @Override
    public byte[] encode() {
        // 构建指令数据结构
        Map<String, Object> commandData = new HashMap<>();
        commandData.put("id", id);
        commandData.put("type", type.getCode());
        commandData.put("priority", priority.getValue());
        commandData.put("timeout", timeout);
        commandData.put("params", params);

        // 将指令转换为JSON格式（实际项目中可能使用自定义二进制协议）
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonCommand;
        try {
            jsonCommand = objectMapper.writeValueAsString(commandData);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
        return jsonCommand.getBytes(StandardCharsets.UTF_8);
    }
}
